package com.csnf.dao;

import com.csnf.entity.Authors;
import com.csnf.entity.Books;
import com.csnf.util.JdbcUtil;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;

/**
 * 作者数据访问对象 (DAO) 类，用于与数据库中的 authors 表进行交互。
 */
public class AuthorDao {

    /**
     * 获取所有作者的列表。
     *
     * @return 包含所有作者信息的列表
     * @throws Exception 如果发生数据库操作异常
     */
    public List<Authors> getAuthorsList() throws Exception {
        // 获取数据库连接
        Connection conn = JdbcUtil.getConnection();
        // 定义 SQL 查询语句
        String sql = "select * from authors";
        // 创建 PreparedStatement 对象
        PreparedStatement ps = JdbcUtil.getPreparedStatement(conn, sql);
        // 执行查询并获取结果集
        ResultSet rs = ps.executeQuery();
        // 创建一个列表来存储所有作者对象
        List<Authors> authorsList = new ArrayList<>();

        // 遍历结果集并将每一行数据映射到 Authors 对象中
        while (rs.next()) {
            Authors authors = JdbcUtil.invokeObject(rs, Authors.class);
            authorsList.add(authors);
        }

        // 关闭数据库资源
        JdbcUtil.close(rs, ps, conn);
        return authorsList;
    }

    /**
     * 根据作者 ID 获取单个作者的详细信息，并关联该作者的所有书籍。
     *
     * @param author_id 作者的唯一标识符
     * @return 包含指定 ID 的作者信息的对象
     * @throws Exception 如果发生数据库操作异常
     */
    public Authors getAuthorById(Integer author_id) throws Exception {
        // 获取数据库连接
        Connection conn = JdbcUtil.getConnection();
        // 定义 SQL 查询语句
        String sql = "select * from authors where author_id=?";
        // 创建 PreparedStatement 对象并设置参数
        PreparedStatement ps = JdbcUtil.getPreparedStatement(conn, sql, author_id);
        // 执行查询并获取结果集
        ResultSet rs = ps.executeQuery();
        // 创建一个空的 Authors 对象
        Authors authors = new Authors();

        // 如果查询到结果，则将结果集映射到 Authors 对象中
        if (rs.next()) {
            authors = JdbcUtil.invokeObject(rs, Authors.class);
        }

        // 创建 BookDao 对象以获取该作者的所有书籍
        BookDao bookDao = new BookDao();
        // 获取该作者的所有书籍列表
        List<Books> booksByAuthor = bookDao.getBooksByAuthor(authors.getAuthor_id());
        // 将书籍列表设置到 Authors 对象中
        authors.setBooksList(booksByAuthor);

        // 关闭数据库资源
        JdbcUtil.close(rs, ps, conn);
        return authors;
    }
}
